"""
生成器函数的使用

生成器函数：
    函数只要有yield关键字。

生成器为惰性求值、延迟求值提供了可能。
"""


def gen_func():
    yield 1
    yield 2


def use_gen_func():
    # 生成器对象（Python编译字节码的时候就产生了）
    gen = gen_func()
    for value in gen:
        print(value)
    # 输出结果：
    """
    1
    2
    """


def fib(n):
    if n <= 2:
        return 1
    else:
        return fib(n - 1) + fib(n - 2)


def use_fib():
    result = fib(10)
    print(result)
    # 输出结果：
    """
    55
    """


def fib2(n):
    r_list = []
    index, x, y = 0, 0, 1

    while index < n:
        r_list.append(y)
        x, y = y, x + y
        index += 1

    return r_list


def use_fib2():
    result = fib2(10)
    print(result)
    # 输出结果：
    """
    [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
    """


def gen_fib(n):
    index, x, y = 0, 0, 1

    while index < n:
        yield y
        x, y = y, x + y
        index += 1


def use_gen_fib():
    result = gen_fib(3)
    print(result)
    # 输出结果：
    """
    1
    2
    """


if __name__ == '__main__':
    use_gen_func()
    use_fib()
    use_fib2()
    use_gen_func()
